#ifndef __APP_UI_H__
#define __APP_UI_H__

#include <stdint.h>

#ifndef NULL
#define NULL (void *)0
#endif

/* ---------------- 状态机 ---------------- */
typedef enum
{
    UI_STATE_MENU = 0x01,
    UI_STATE_SLIDER,
    UI_STATE_SELECTOR,
    UI_STATE_FILE_BROWSER,
    UI_STATE_POPUP,
    UI_STATE_USER,
} UiStateEnum;

/* ---------------- 消息码 ---------------- */
typedef enum
{
    UI_MSG_UP = 0x01,
    UI_MSG_DOWN,
    UI_MSG_ENTER,
    UI_MSG_BACK,

    UI_MSG_SLIDER_ADD,
    UI_MSG_SLIDER_SUB,
    UI_MSG_SLIDER_OK,

    UI_MSG_SELECTOR_ADD,
    UI_MSG_SELECTOR_SUB,
    UI_MSG_SELECTOR_OK,

    UI_MSG_FILE_BROWSER_UP,
    UI_MSG_FILE_BROWSER_DOWN,
    UI_MSG_FILE_BROWSER_ENTER,
    UI_MSG_FILE_BROWSER_BACK,

    UI_MSG_UP_CLICK,     // 上键单击
    UI_MSG_DOWN_CLICK,   // 下键单击
    UI_MSG_LEFT_CLICK,   // 左键单击
    UI_MSG_RIGHT_CLICK,  // 右键单击
    UI_MSG_MIDDLE_CLICK, // 中键单击

    UI_MSG_UP_DOUBLE_CLICK,     // 上键双击
    UI_MSG_DOWN_DOUBLE_CLICK,   // 下键双击
    UI_MSG_LEFT_DOUBLE_CLICK,   // 左键双击
    UI_MSG_RIGHT_DOUBLE_CLICK,  // 右键双击
    UI_MSG_MIDDLE_DOUBLE_CLICK, // 中键双击

    UI_MSG_UP_HOLD,     //  上键按住
    UI_MSG_DOWN_HOLD,   //  下键按住
    UI_MSG_LEFT_HOLD,   //  左键按住
    UI_MSG_RIGHT_HOLD,  //  右键按住
    UI_MSG_MIDDLE_HOLD, //  中键按住

    UI_MSG_UP_LONG,     // 上键长按
    UI_MSG_DOWN_LONG,   // 下键长按
    UI_MSG_LEFT_LONG,   // 左键长按
    UI_MSG_RIGHT_LONG,  // 右键长按
    UI_MSG_MIDDLE_LONG, // 中键长按
} UiMsgEnum;

/* ---------------- 组件类型 ---------------- */
typedef enum
{
    UI_COMP_NONE = 0,
    UI_COMP_SLIDER,
    UI_COMP_SELECTOR,
    UI_COMP_FILE_BROWSER
} UiCompTypeEnum;

/* ---------------- 滑条（读写 + 只读） ---------------- */
typedef struct
{
    int16_t current;      /* 当前值（读写） */
    unsigned int last_ms; /* 最近操作时间戳（用于超时退出编辑） */
} UiSliderVars;

typedef struct
{
    const int16_t min;
    const int16_t max;
    const int16_t step;
    const uint16_t timeout_ms;
    const char *unit;  /* 显示单位，例如 "%"、"dB" 等 */
    UiSliderVars *var; /* 运行时变量 */
} UiSlider;

/* ---------------- 选择器（读写 + 只读） ---------------- */
typedef struct
{
    uint8_t current;      /* 当前选项索引（读写） */
    unsigned int last_ms; /* 最近操作时间戳（用于超时退出编辑） */
} UiSelectorVars;

typedef struct
{
    const char *const *options; /* 字符串选项表 */
    const uint8_t option_num;   /* 选项数量 */
    const uint16_t timeout_ms;  /* 编辑超时 */
    UiSelectorVars *var;        /* 运行时变量 */
} UiSelector;

/* ---------------- 文件浏览器（读写 + 只读） ---------------- */
typedef struct
{
    uint8_t file_total;     // 当前目录文件总数
    uint8_t current_index;   // 当前选中下标
    uint8_t top_index;       // 当前显示的第一行下标（用于滚动）
    uint8_t depth;           // 当前深度（用于返回）
    uint8_t history_idx[10]; // 每层离开时的下标
} UiFileBrowserVars;

typedef struct
{
    UiFileBrowserVars *var;
} UiFileBrowser;

/* ---------------- 菜单项 ---------------- */
typedef struct MenuItem
{
    const char *name;
    const struct MenuItem *parent;
    const struct MenuItem *const *children;
    const uint8_t child_num;
    void (*handler)(void *); /* 统一 void * 参数：
                              *  - 对于无组件的菜单：传入 NULL/0
                              *  - 对于滑条：传入 int16_t*（当前值地址）
                              *  - 对于选择器：传入 uint8_t*（当前索引地址）
                              *  - 对于文件浏览器：传入 const char*（选中文件全路径）
                              */
    UiCompTypeEnum comp_type;
    void *comp; /* 指向 UiSlider / UiSelector / UiFileBrowser */
} UiMenuItem;

extern UiStateEnum mini_ui_state;

/**
 * @breif   初始化UI菜单
 * @param   无
 * @retval  无
 */
void mini_ui_init(void);

/**
 * @breif   UI主循环
 * @param   无
 * @retval  无
 */
void mini_ui_main(uint8_t msg);

/**
 * @breif   设置用户自定义状态回调
 * @param   cb 回调函数
 * @retval  无
 */
void mini_ui_set_user_callback(void (*cb)(uint8_t msg));

/**
 * @breif   返回上一次UI状态
 * @param   无
 * @retval  无
 */
void mini_ui_set_last_state(void);

/**
 * @breif   显示提示框
 * @param   text 提示文本
 * @param   timeout_ms 超时时间
 * @param   return_state 返回状态
 * @retval  无
 */
void mini_ui_show_popup(const char *text, uint16_t timeout_ms, uint8_t return_state);



#endif
